<?php
namespace SDF\Lib\Order;
use SDF\Db\MongoDb;

/**
 * 支付凭证(原支付单)
 */
class order_pay extends MongoDb {
    /**
     * 支付凭证
     */
    public function __construct() {
        parent::__construct('order_pay','order');
    }

    /**
     * 获取可用的预支付单
     * @param $order_id
     * @param $member_id
     * @param string $pay_type
     * @return array
     * @throws \Exception
     */
    public function getOrderPayUsable($order_id,$member_id,$pay_type = 'wxpay'){
        $ls = $this->find(array(
            'order_id' => self::format($order_id),
            'member_id' => self::format($member_id),
            'pay_type' => $pay_type,
        ));
        foreach ($ls  as $vo){
            if (time() - $vo->create_time <= 600){
                return (array)$vo;
            }
        }
        return array();
    }

    /**
     * 订单的支付信息
     * @param $_id
     * @param $order_id
     * @param $member_id
     * @param string $pay_type
     * @param array $unifiedorder
     * @param int $order_total_price
     * @return array
     * @throws \Exception
     */
    public function add($_id,$order_id,$member_id,$pay_type = 'wxpay',array $unifiedorder = array(),$order_total_price = 0){
        $order_info = array();
        $order_info['order_id'] = self::format($order_id);
        $order_info['create_time'] = $order_info['update_time'] = time();
        $order_info['member_id'] = self::format($member_id);
        $order_info['pay_type'] = $pay_type == 'alipay'?'alipay':'wxpay';
        $order_info['order_total_price'] = $order_total_price;
        $order_info['unifiedorder'] = $unifiedorder;
        $this->updateOne(['_id'=>self::format($_id)],array(
            '$set'=>$order_info,
        ),true);
        return $order_info;
        //统一支付订单信息如下：
        /*
        [appid] => wx079f3f160983d52d       调用接口提交的公众账号ID
        [mch_id] => 1383241102              调用接口提交的商户号
        [nonce_str] => T1LtRqlLGJW1CAgi     微信返回的随机字符串
        [prepay_id] => wx201611191803096697d1f9980548380538     微信生成的预支付回话标识，用于后续接口调用中使用，该值有效期为2小时
        [result_code] => SUCCESS            SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
        [return_code] => SUCCESS            SUCCESS/FAIL 业务结果
        [return_msg] => OK                  返回信息，如非空，为错误原因 签名失败 参数格式校验错误
        [sign] => F8CB4A56087DE2A37EF3A54BAB3DAF8B      微信返回的签名，详见签名算法
        [trade_type] => JSAPI               调用接口提交的交易类型，取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
        */
        //微信订单查询结果
        /*Array
        (
            [appid] => wx079f3f160983d52d                   微信分配的公众账号ID（企业号corpid即为此appId）
            [mch_id] => 1383241102                          微信支付分配的商户号
            [nonce_str] => meKP1VEKzmOiF9LE                 随机字符串，不长于32位。推荐随机数生成算法
            [out_trade_no] => 583d506c316c31d07b8b456c      商户系统的订单号，与请求一致。
            [result_code] => SUCCESS                        业务结果    SUCCESS/FAIL
            [return_code] => SUCCESS                        SUCCESS/FAIL  此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
            [return_msg] => OK                              返回信息，如非空，为错误原因  签名失败  参数格式校验错误
            [sign] => 6663F8F32949DEE47F2D0F9FF2D050E1      签名，详见签名生成算法
            [trade_state] =>NOTPAY                          交易状态 SUCCESS—支付成功
                                                            REFUND—转入退款
                                                            NOTPAY—未支付
                                                            CLOSED—已关闭
                                                            REVOKED—已撤销（刷卡支付）
                                                            USERPAYING--用户支付中
                                                            PAYERROR--支付失败(其他原因，如银行返回失败)
            [trade_state_desc] => 订单未支付                对当前查询订单状态的描述和下一步操作的指引
        )
        //微信订单回调结果
        /*Array
        (
            //"appid" : "wx079f3f160983d52d",
            //"attach" : "test",
            //"bank_type" : "CFT",
            //"cash_fee" : "1",
            //"fee_type" : "CNY",
            //"is_subscribe" : "Y",
            //"mch_id" : "1383241102",
            //"nonce_str" : "ctb3hwckvi7m7i91853yfxr25vqc927m",
            //"openid" : "ozD3LwG7CUaq2lQV4ZmkOvXJDpb0",
            //"out_trade_no" : "583ff81f316c31ea738b45cc",
            //"result_code" : "SUCCESS",
            //"return_code" : "SUCCESS",
            //"sign" : "B4A202811B7ABD9B7DAE3DB5747FCE3E",
            //"time_end" : "20161201181505",
            //"total_fee" : "1",
            //"trade_type" : "JSAPI",
            //"transaction_id" : "4001042001201612011418160400"
        )
        */
    }

    /**
     * 更新支付单的支付结果（保存最后一次修改，并记录每次修改的日志），参数需要调用微信订单查询接口
     * @param $_id
     * @param array $data
     * @return mixed
     * @throws \Exception
     */
    public function updatePayResults($_id,array $data){
        $data['update_time'] = time();
        $ret = $this->updateOne(['_id'=>self::format($_id)],array(
            '$set'=>array('pay_results' => $data),
            '$push'=>array('pay_results_log' => $data),
        ),true);
        return $ret;
    }

    /**
     * 保存支付成功的回掉结果
     * @param $_id
     * @param array $data
     * @return array
     * @throws \Exception
     */
    public function updateNotifyProcess($_id,array $data){
        $data['update_time'] = time();
        $this->updateOne(['_id'=>self::format($_id)],array(
            '$set'=>array('notify_process' => $data),
            '$push'=>array('notify_process_log' => $data),
        ),true);
        return $data;
    }


    /**
     * 获取指定订单的支付单列表
     * @param $order_id
     * @param string $pay_type
     * @return \MongoDB\Driver\Cursor
     * @throws \Exception
     */
    public function getByOrderId($order_id,$pay_type = 'wxpay'){
        $where = array('order_id'=>self::format($order_id));
        if (in_array($pay_type,array('wxpay','alipay'))){
            $where['pay_type'] = $pay_type;
        }
        $ls = $this->findOne($where);
        //$ls->sort(['_id'=>-1]);
        //$ls = self::iterator_to_array($ls,false);
        return $ls;
    }
}